﻿#include "HelloWorldScene.h"

USING_NS_CC;



Scene* HelloWorld::createScene()
{
    // 'scene' is an autorelease object
    auto scene = Scene::create();
    
    // 'layer' is an autorelease object
    auto layer = HelloWorld::create();

    // add layer as a child to scene
    scene->addChild(layer);

    // return the scene
    return scene;
}

// on "init" you need to initialize your instance
bool HelloWorld::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !Layer::init() )
    {
        return false;
    }
    
    Size visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();

    /////////////////////////////
    // 2. add a menu item with "X" image, which is clicked to quit the program
    //    you may modify it.

    // add a "close" icon to exit the progress. it's an autorelease object
    auto closeItem = MenuItemImage::create(
                                           "CloseNormal.png",
                                           "CloseSelected.png",
                                           CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
    
	closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width/2 ,
                                origin.y + closeItem->getContentSize().height/2));

    // create menu, it's an autorelease object
    auto menu = Menu::create(closeItem, NULL);
    menu->setPosition(Vec2::ZERO);
    this->addChild(menu, 1);

    /////////////////////////////
    // 3. add your codes below...

    // add a label shows "Hello World"
    // create and initialize a label
    
    auto label = Label::createWithTTF("Hello World", "fonts/Marker Felt.ttf", 24);
    
    // position the label on the center of the screen
    label->setPosition(Vec2(origin.x + visibleSize.width/2,
                            origin.y + visibleSize.height - label->getContentSize().height));

    // add the label as a child to this layer
    this->addChild(label, 1);

    // add "HelloWorld" splash screen"
    auto sprite = Sprite::create("HelloWorld.png");

    // position the sprite on the center of the screen
    sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));

    // add the sprite as a child to this layer
    this->addChild(sprite, 0	);

	std::string host = "";
	unsigned short  port = 0;
	unsigned short  sleep = 0;
	NetChannel channel = NetChannel::NET_HTTP_CHANNEL;
	auto fullPath = FileUtils::getInstance()->fullPathForFilename("config.plist");
	if (!fullPath.empty())
	{
		auto *ip = Dictionary::createWithContentsOfFileThreadSafe(fullPath.c_str());
		if (ip)
		{
			auto model = (CCString)ip->valueForKey("model")->getCString();
			
			if (std::string(model.getCString()) == "socket")
			{
				 channel = NetChannel::NET_SOCKET_CHANNEL;
			}
			auto host1 = (CCString)ip->valueForKey("host")->getCString();			
			host.append(host1.getCString());

			port = ip->valueForKey("port")->intValue();
			sleep = ip->valueForKey("sleep")->intValue();
		}
	}
	//初始化(静态类,内部指针地址正常只会有一个)
	auto NetworkHandel = NetChannelHandel::getInstance();
	//CCLOG("%s,%d", host,port);
    //初始化地址
	NetworkHandel->setAddr(host, port);
	//NetworkHandel->setAddr("192.168.1.13", 16999);
	//初始化模式
	NetworkHandel->setModel(NetChannel::NET_SOCKET_CHANNEL);
	//初始化线程
	NetworkHandel->startThread();
	//设置监听回调
	NetworkHandel->addEventListeners(50000, NET_CALLBACK(HelloWorld::netCallback_4998, this));
	//NetworkHandel->addEventListeners(1002, NET_CALLBACK(HelloWorld::netCallback_1002, this));
	/*
	//数据发送样例1
	auto* buff = new ByteArray(RECVMAXLEN);
	buff->setCmdType(4998);
	buff->write_string("The string test,中文啊");//
	buff->write_short(1243);
	NetworkHandel->sendMsg(buff);
	//数据发送样例2
	auto* buff1 = new ByteArray(RECVMAXLEN);
	buff1->setCmdType(1002);
	NetworkHandel->sendMsg(buff1);
	*/
	this->schedule(schedule_selector(HelloWorld::send), 3.0f);
    return true;
}


void HelloWorld::send(float dt)
{
	//
	auto NetworkHandel = NetChannelHandel::getInstance();
	auto* sendBuf = new ByteArray(RECVMAXLEN);
	sendBuf->setCmdType(50000);
	NetworkHandel->sendMsg(sendBuf);

	sendBuf = new ByteArray(RECVMAXLEN);
	sendBuf->setCmdType(50000);
	NetworkHandel->sendMsg(sendBuf);

	sendBuf = new ByteArray(RECVMAXLEN);
	sendBuf->setCmdType(50000);
	NetworkHandel->sendMsg(sendBuf);
}

void HelloWorld::netCallback_4998(ByteArray* array)
{
	/*
	int  status = array->read_int();
	int num = array->read_int();
	std::string msg = array->read_string();
	*/
	CCLOG("netCallback=%d", array->getCmdType());
}

void HelloWorld::netCallback_1002(ByteArray* array)
{
	CCLOG("netCallback=%d", array->getCmdType());
}

void HelloWorld::menuCloseCallback(Ref* pSender)
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
	MessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");
    return;
#endif

    Director::getInstance()->end();
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    exit(0);
#endif
}
